// 数组扁平化
// const test = ['a', ['b', 'c'], ['d', ['e', 'f'], 'g']]
function myflat(lay = 1, test) {
    if (lay <= 0) {
        return [...test]
    }
    // lay === undefined ? 1 : lay;
    const tar = JSON.parse(JSON.stringify(test)), rst = []
    for (const i in tar) {
        if (Array.isArray(tar[i])) {
            rst.push(...flat(lay - 1, [...tar[i]]))
        } else {
            rst.push(tar[i])
        }
    }
    return rst
}
// flat(1, test)
// 重新认识reduce可以写一篇文章
// 今天算法3道，面试总结，电话和笔试   ---- 加油!!!!
// Typescript 认识一下 准备 -- 用法 -- 使用场景(区别) --- 会遇到的小问题[this指向问题]
// 重新认识reduce((accumulator, currentValue, index, arr)=>{},initialValue)
// 跟generator有点像。。。想想使用关联  
// 全扁平化
/* const arr = [[0, 1], [2, 3], [4, 5]]
function flatReduce1(arr) {
    return arr.reduce((pre, cur) => {
        return Array.isArray(cur) ? pre.concat(...flatReduce(cur)) : pre.concat(cur)
    }, [])
} */
// console.log(flatReduce1(test))
// 三分钟学前端
/* function flattenDeep11 (arr) {
    return Array.isArray(arr) ? arr.reduce( (acc, cur) => [...acc, ...flattenDeep(cur)], []) : [arr]
} */

// ---------------------
// 当depth大于0时，解析
function flat2(arr, depth = 1) {
    return depth > 0 ? arr.reduce((acc, cur) => {
        return Array.isArray(cur) ? [...acc, ...flat(cur, depth - 1)] : [...acc, cur]
    }, []) : [...arr]
}
// 使用栈 --- 会打乱顺序  // 全扁平化
function flattenDeep3(arr) {
    const stack = [...arr]
    const result = []
    while (stack.length !== 0) {
        let v = stack.pop()
        if (Array.isArray(v)) {
            stack.push(...v)
        }else{
            result.unshift(v)
        }
    }
    return result
}

// 函数
// function.length 是形参；arguments.length 是实参
// function a(x,y=10){}  a.length ===1??


// 数组去重
const test = [1, 2, 2, 3]
function unique1(arr) {
    return [...new Set(arr)]
}
function unique2(arr) {
    return arr.reduce((acc, cur) => {
        if (acc.includes(cur)){
            return acc
        }
        return [...acc, cur]
    }, [])
}
// 破坏顺序 双指针
/* function unique3 (arr) {
    const arrSorted = arr.sort((a, b) => a-b)
    const result = []
    return arrSorted.reduce((acc, cur) => {
        while(acc !== cur) {
            result.push()
        }
    })
} */
function unique3(arr) {
    return arr.sort().reduce((acc, cur) => {
        if (acc.length === 0 && acc[acc.length-1] !== cur) {
            acc.push(cur)
        }
        return acc
    }, [])
}
// filter
function unique4 (arr) {
    return arr.filter((value, key) => {
        return arr.indexOf(value) === key
    })
}

function curry (fn, ...args) {
    args = args.length === 0 ? [] : args
    const length = fn.length
    return function () {
        for(let k in arguments){
            args.push(arguments[k])
        }
        const self = this
        const _args = args.slice()
        if (args.length === length) {
            return fn.apply(self, args)
        } else {
            return curry.apply(self, fn, args)
        }
    }
}




// 深拷贝

